package com.ht.api.call.func.impl.wwx;

import java.util.Map.Entry;

import javax.sql.DataSource;

import com.ht.api.bean.AjaxResult;
import com.ht.api.bean.LoginBean;
import com.ht.api.call.func.IFunctionCall;
import com.ht.api.constant.CacheConstants;
import com.ht.api.db.Db;
import com.ht.api.db.Entity;
import com.ht.api.db.exception.HtException;
import com.ht.api.db.util.HtUtil;
import com.ht.api.db.util.RedisUtil;
import com.ht.api.open.OpenUtil;

import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;

/**
 * 更新成员
 * @author asq
 * @createTime 2025年1月13日 22:19:08
 */
@Slf4j
public class WwxUserEditFunctionCall implements IFunctionCall {
	/** 接口ID：更新成员 */
	private static final long API_ID_EDIT = 1887375751213355008L;
	/** 接口ID：上传临时素材 */
	private static final long API_ID_UPLOAD = 1891784559327055872L;

	@Override
	public String getName() {
		return "更新成员";
	}

	@Override
	public JSONObject execute(LoginBean me, JSONObject param, AjaxResult result) {
		// 获取登陆用户的数据源
		DataSource ds = me.getDataSource();
		
		// 验证参数
		HtUtil.checkParam(param, "main_id");
		
		// 查询
		String mainId = param.getStr("main_id");
		Entity wxWorkuser = Db.createSqlParser("wx_workuser").findById(ds, mainId);
		if (wxWorkuser == null) {
			throw new HtException("数据不存在~");
		}
		
		// 获取appid
		String appId = wxWorkuser.getStr("tenant_appid");
		String appIdBook = getAddressBookAppId(appId);
		
		// 根据前端参数赋值给wxJoinWay对象，后面直接保存
		for (Entry<String, Object> entry : param.entrySet()) {
			wxWorkuser.set(entry.getKey(), entry.getValue());
		}
		
		// 如果前端上传了头像，还需要上传素材到企微，然后获取media_id
		setMediaId(param, appId);
		
		// 调用企微接口
		param.set("userid", wxWorkuser.getStr("userid"));
		String str = OpenUtil.call(appIdBook, API_ID_EDIT, param);
		
		// 本地数据库
		JSONObject obj = JSONUtil.parseObj(str);
		if (obj.getInt("errcode") == 0) {
			Db.insert(ds, wxWorkuser);
		} else {
			throw new HtException("企微接口返回错误：" + obj.getStr("errmsg"));
		}
		
		return JSONUtil.createObj();
	}
	
	/**
	 * 上传阿里云图片到企微，获取素材ID
	 * @param param 前端参数
	 * @param wxWorkuser 
	 * @return
	 */
	private void setMediaId(JSONObject param, String appId) {
		// 如果前端上传了头像，还需要上传素材到企微，然后获取media_id
		if (param.containsKey("avatar")) {
			JSONObject wxParam = JSONUtil.createObj();
			wxParam.set("type", "image");
			wxParam.set(OpenUtil.PARAM_OSS_URL, param.getStr("avatar"));
			String str = OpenUtil.call(appId, API_ID_UPLOAD, wxParam);
			JSONObject obj = JSONUtil.parseObj(str);
			if (obj.getInt("errcode") == 0) {
				param.set("avatar_mediaid", obj.getStr("media_id"));
			} else {
				throw new HtException("上传企微素材失败：" + obj.getStr("errmsg"));
			}
		}
	}
	
	/**
	 * 获取应用配置的通讯录应用ID
	 * @param appId 主应用ID
	 * @return
	 */
	private String getAddressBookAppId(String appId) {
		Entity app = RedisUtil.get(CacheConstants.KEY_APP + appId);
		JSONObject appConfig = JSONUtil.parseObj(app.getStr("config"));
		String addressBookAppId = appConfig.getStr("address_book_id");
		if (addressBookAppId != null) {
			return addressBookAppId;
		} else {
			throw new HtException("应用未配置对应的通讯录应用ID，无法更新成员");
		}
	}
}
